/**********************************************************************************************************
** 文件名:		output.c
** 版本：      	1.0
** 工作环境:	RealView MDK-ARM 5.11
** 作者: 		盖书永
** 生成日期: 	2014年12月15日09:44:16
** 功能:	    开关量输出控制驱动
** 相关文件:	无
** 修改日志：	
**********************************************************************************************************/
#include "Includes.h"

typedef struct{								   
	Var	out;
}Data_Struct;									//定义变量结构

const static Var_Property_Def var_attr[] = {	//声明变量属性
	{
		BOOLEAN,
		0,
		READWRITE,
		"output",
		"开关输出",
		"",
		"开关量输出控制",
		0,
		0,
		"",
		"",
		0,
		0
	}	
};

/**********************************************************************************************************
* 函数名称： static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
* 函数说明： 生成获取传感器数据指令
* 输入参数： 指令索引，传感器地址，变量结构体指针,以及指令缓存区指针,指令长度
* 返回参数： 无
**********************************************************************************************************/
static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
{
	Data_Struct 	*d = (Data_Struct*)data;
	switch(index)
	{
		case 0:	
			if(d->out.status){
				cmd[0] = 0xA5;
				cmd[1] = 0x05;
				cmd[2] = (addr>>8)&0x00FF;			
				cmd[3] = addr&0x00FF;
				cmd[4] = 0x05;
				cmd[5] = 0x00;								
				cmd[6] = 0x00;
				if(d->out.value.inum){
					cmd[7] = 0xFF;	
					cmd[8] = 0x00;				
				}
				else{
					cmd[7] = 0x00;	
					cmd[8] = 0x00;
				}
				*len = CRC16_Padding(cmd, 9);
			}
			else{
				*len  = -1;			
			}
			break;
		case 1:	
			cmd[0] = 0xA5;
			cmd[1] = 0x05;
			cmd[2] = (addr>>8)&0x00FF;			
			cmd[3] = addr&0x00FF;
			cmd[4] = 0x04;
			cmd[5] = 0x00;								
			cmd[6] = 0x00;
			cmd[7] = 0x00;	
			cmd[8] = 0x02;
			*len = CRC16_Padding(cmd, 9);
			break;
		default:
			break;
	}
}


/**********************************************************************************************************
* 函数名称： static int parse_fun(short index, int addr, void *data, char *buf, short len)
* 函数说明： 解析传感器响应的数据，并写入数据库
* 输入参数： 解析索引,传感器地址，变量结构体指针，以及响应数据缓存取指针，响应数据长度
* 返回参数： 返回解析结果，返回0成功，返回1失败
**********************************************************************************************************/
static int parse_fun(short index, int addr, void *data, char *buf, short len)
{
	Data_Struct 	*d = (Data_Struct*)data;
	unsigned char	*buffer = (unsigned char*)buf;
	if(buf!=NULL && len==12 && buffer[0]==0xA5 && buffer[1]==0x05 && addr==((buffer[2]<<8) + buffer[3]) )
	{	
		if(CRC16_Check(buf,len)){
			switch(index){
				case 0:	
					d->out.status = Normal;					
					break;
				case 1:	
					if(buffer[8]==0xff&&buffer[9]==0x00){
						d->out.value.inum = 1;
					}
					else{
						d->out.value.inum = 0;
					}					
					break;				
			}
			return 0;		
		}
	}
	return 1;
}


/**********************************************************************************************************
* 函数名称： void Output_Registration(void)
* 函数说明： 开关量控制器注册
* 输入参数： 无
* 返回参数： 无
**********************************************************************************************************/
void Output_Registration(void)
{
	Device_Registration("switchout",				//设备类型
						"开关控制",					//设备名称（导航栏默认显示名称）
						"any",						//设备型号
						"开关量输出控制",			//设备描述
						var_attr,					//变量属性结构 
						sizeof(Data_Struct),		//变量结构体空间大小
						cmd_fun,					//发送指令生成函数
						parse_fun					//数据解析函数
	);
}
